package main

import (
	"database/sql"
	pb "ihos/ihos"
	"log"

	tm "github.com/golang/protobuf/ptypes/timestamp"
)

type shipin struct {
	id   int32  //PK
	fjh  string //房间号
	cjz  string //创建者名称
	cjsj int64  //创建时间
	gbsj int64  //关闭时间
	zt   int32  //状态
	lxdz string //录像地址
	lx   int32  //类型
	yhid int32  //创建者用户ID
	yhlx int32  //创建者用户类型
}

func (w *shipin) GetFromDB(id int32) error {
	sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin WHERE id=$1"
	return DBConn.db.QueryRow(sql, id).Scan(&w.id, &w.fjh, &w.cjz, &w.cjsj, &w.gbsj, &w.zt, &w.lxdz, &w.lx, &w.yhid, &w.yhlx)
}

func (w *shipin) GetFromDBByFjh(fjh string) error {
	sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin WHERE fjh=$1"
	return DBConn.db.QueryRow(sql, fjh).Scan(&w.id, &w.fjh, &w.cjz, &w.cjsj, &w.gbsj, &w.zt, &w.lxdz, &w.lx, &w.yhid, &w.yhlx)
}

func (w *shipin) GetFromDBByLx(lx int32) error {
	sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin WHERE lx=$1"
	return DBConn.db.QueryRow(sql, lx).Scan(&w.id, &w.fjh, &w.cjz, &w.cjsj, &w.gbsj, &w.zt, &w.lxdz, &w.lx, &w.yhid, &w.yhlx)
}

func (w *shipin) GetShiPinList() (sps []*shipin, err error) {
	log.Println("table GetShiPinList:", w)
	var rows *sql.Rows
	out := make([]*shipin, 0)

	if w.id > 0 {
		sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin WHERE id=$1"
		rows, err = DBConn.db.Query(sql, w.id)
	} else if len(w.fjh) > 0 {
		sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin WHERE fjh=$1 AND gbsj=0"
		rows, err = DBConn.db.Query(sql, w.fjh)
		log.Println(sql)
	} else {
		sql := "SELECT id,fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx FROM shipin ORDER BY id DESC LIMIT 100"
		rows, err = DBConn.db.Query(sql)
	}
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	for rows.Next() {
		w := &shipin{}
		if err = rows.Scan(&w.id, &w.fjh, &w.cjz, &w.cjsj, &w.gbsj, &w.zt, &w.lxdz, &w.lx, &w.yhid, &w.yhlx); err != nil {
			//return nil, err
		} else {
			out = append(out, w)
		}
	}
	return out, nil
}

func (w *shipin) SaveToDB(id int32) error {
	sql := ""
	var err error
	if id > 0 { //update
		sql = "UPDATE shipin set fjh=$1,cjz=$2,cjsj=$3,gbsj=$4,zt=$5,lxdz=$6,lx=$7,yhid=$8,yhlx=$9 where id=$10 RETURNING id"
		err = DBConn.db.QueryRow(sql, w.fjh, w.cjz, w.cjsj, w.gbsj, w.zt, w.lxdz, w.lx, w.yhid, w.yhlx, w.id).Scan(&w.id)
	} else { //insert
		sql = "INSERT INTO shipin(fjh,cjz,cjsj,gbsj,zt,lxdz,lx,yhid,yhlx) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING id"
		err = DBConn.db.QueryRow(sql, w.fjh, w.cjz, w.cjsj, w.gbsj, w.zt, w.lxdz, w.lx, w.yhid, w.yhlx).Scan(&w.id)
	}
	return err
}

func (w *shipin) toPB() *pb.ShiPinInfoL1 {
	p := &pb.ShiPinInfoL1{
		ID:   w.id,
		FJH:  w.fjh,
		CJZ:  w.cjz,
		CJSJ: &tm.Timestamp{Seconds: w.cjsj},
		GBSJ: &tm.Timestamp{Seconds: w.gbsj},
		LXDZ: w.lxdz,
		LX:   pb.SPLX(w.lx),
		YHID: w.yhid,
		YHLX: pb.YHLX(w.yhlx),
	}
	return p
}

func (w *shipin) fromPB(p *pb.ShiPinInfoL1) *shipin {
	w.id = p.GetID()
	w.fjh = p.GetFJH()
	w.cjz = p.GetCJZ()
	w.cjsj = p.GetCJSJ().GetSeconds()
	w.gbsj = p.GetGBSJ().GetSeconds()
	w.lxdz = p.GetLXDZ()
	w.lx = int32(p.GetLX())
	w.yhid = p.GetYHID()
	w.yhlx = int32(p.GetYHLX())
	return w
}
